package TUILayer;
import java.util.Scanner;
import ControlLayer.*;
/**
 * New sale user interface:
 * Enables the user to add items, customer and employee to a sale
 * Enables the user to end a sale and recevie payment
 * 
 * @author (Gruppe 3)
 */

/**
 * New Sale user interface:
 * Enables the user to create a new sale. 
 * User can add a customer, add an employee and items to the sale
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class NewSaleUI
{    
    // instance variables
    private SaleCtr saleCtr;
    
    public NewSaleUI()
    {
        this.saleCtr = new SaleCtr();
    }
    
    /**
     * Opens the new sale menu
     */
    public void open()
    {
        newSaleMenu();
    }
    
    /** 
     * Calls the print new sale menu method and let the user pick a choice for the menu
     */
    private void newSaleMenu()
    {
        boolean back = false;
            while(!back)
            {
                int choice = makeNewSaleMenu();
                
                if(choice == 1)
                {
                    //add employee to the new sale
                    addEmployeeToSale();
                }
                else
                {
                    if(choice == 2)
                    {   
                        // add customer to the new sale
                        addCustomerToSale();
                    }
                    else
                    {
                        if(choice == 3)
                        {   
                            // add item to the sale
                            addItemToSale();
                        }
                        else
                        {
                            if(choice == 4)
                            {
                                // remove item from the sale
                                removeItemfromSale();
                            }
                            else
                            {
                                if(choice == 5)
                                {
                                    showAllPartSales();
                                }
                                else
                                {
                                    if(choice == 6)
                                    {
                                        endSale();
                                        back = true;
                                    }
                                    else
                                    {
                                        if(choice == 7)
                                        {
                                            back = true;
                                        }
                                        else
                                        {
                                            System.out.println("Indtast et nummer mellem 1 og 7");
                                            waitInput();
                                        }
                                    }
                                }
                            }                      
                        }
                    }
                }
            }
    }
    
    /**
     * Prints new Sale menu
     */
    private int makeNewSaleMenu()
    {
        Scanner keyboard = new Scanner(System.in);
        System.out.println("\f ### Nyt salg menu ### ");
        System.out.println(" (1) Tilføj ansat til salget");
        System.out.println(" (2) Tilføj kunde til salget");
        System.out.println(" (3) Tilføj vare til salget");
        System.out.println(" (4) Fjern vare fra salget");
        System.out.println(" (5) Salgsoversigt");
        System.out.println(" (6) Afslut salget");
        System.out.println(" (7) Tilbage");
        System.out.println("\n Vælg et nummer");
        
        int choice = keyboard.nextInt();
        
        return choice;
    }
    
    /**
     * System waits for an input, so the user can read the screen information
     */
    private void waitInput()
    {
        System.out.println("Tryk på en tast for at forsætte");
        new Scanner(System.in).nextLine();
    }
    
    /**
     * input of a string
     */
    private String inputString()
    {
        Scanner keyboard = new Scanner(System.in);
        String newInput = keyboard.nextLine();
        return newInput;
    }

    /**
     * checks if the input is an integer
     * 
     * @param checkInput  string to check if it is an integer
     */ 
    private boolean isDouble(String checkInput)
    {
        try
        {
            Double.parseDouble(checkInput);
        }
        catch(NumberFormatException e)
        {   
            System.out.println("Du skal skrive et heltal eller decimaltal.");
            return false;
        }
        
        return true;        
    }    
    
    /**
     * inputs a variable of the type double
     */
    private double inputDouble()
    {
        Scanner keyboard = new Scanner(System.in);      
        boolean parsedInput = false;
        
        while(!parsedInput)
        {   
            String testInput = keyboard.nextLine();
            
            // checks if the input string is an integer
            if (isDouble(testInput))
            {   
                parsedInput = true;
                double newInput = Double.parseDouble(testInput);               
                return newInput;
            }
        }
           
        return 0;
    }
    
    /**
     * checks if the input is an integer
     * 
     * @param checkInput  string to check if it is an integer
     */ 
    private boolean isInteger(String checkInput)
    {
        try
        {
            Integer.parseInt(checkInput);
        }
        catch(NumberFormatException e)
        {   
            System.out.println("Du skal skrive et heltal.");
            return false;
        }
        
        return true;        
    }
    
    /**
     * inputs a variable of the type int
     */
    private int inputInt()
    {
        Scanner keyboard = new Scanner(System.in); 
        boolean parsedInput = false;
        
        while(!parsedInput)
        {   
            String testInput = keyboard.nextLine();
            
            // checks if the input string is an integer
            if (isInteger(testInput))
            {   
                parsedInput = true;
                int newInput = Integer.parseInt(testInput);               
                return newInput;
            }
        }
           
        return 0;
    }    
    
    /**
     * add Employee to the new sale
     */
    private void addEmployeeToSale()
    {   
        System.out.println("Indtast ID på den ansat som skal tilknyttes salget");
        String employeeID = inputString();
        
        if (employeeID != null && !employeeID.isEmpty())
        {
            try
            {
                saleCtr.addEmployee(employeeID);
                System.out.println("Ansat med id: " + employeeID + " blev tilføjet som ansvarlig for salget");
                waitInput();
            }
            catch(NullPointerException e)
            {
                System.out.println("Systemet kunne ikke tilføje den ansatte til salget");
                System.out.println("(den ansatte findes muligvis ikke i systemet)");
                waitInput();
            }   
        }
        else
        {
            System.out.println("Du skal indtaste et gyldig ID for at kunne tilføje en ansat til salget");
            waitInput();
        }   
    }
    
    /**
     * add customer to the new sale
     */
    private void addCustomerToSale()
    {   
        System.out.println("Indtast ID på den kunde som skal tilknyttes salget");
        String customerID = inputString();
        
        if (customerID != null && !customerID.isEmpty())
        {
            try
            {
                saleCtr.addCustomer(customerID);
                System.out.println("Kunden med id: " + customerID + " blev tilføjet til salget");
                waitInput();
            }
            catch(NullPointerException e)
            {
                System.out.println("Systemet kunne ikke tilføje kunden til salget");
                System.out.println("Kunden findes muligvis ikke i systemet)");
                waitInput();
            }     
        }
        else
        {
            System.out.println("Du skal indtaste et gyldig ID for at kunne tilføje en kunde til salget");
            waitInput();
        }
    }
    
    /**
     * add item to the new sale
     */
    private void addItemToSale()
    {   
        System.out.println("Indtast id på den vare som skal tilføjes salget");
        String newSaleItemSearch = inputString();
        System.out.println("Indtast antal af den vare som skal tilføjes salget");
        int newSaleItemAmount = inputInt();
        
        if (newSaleItemSearch != null && !newSaleItemSearch.isEmpty())
        {
            try 
            {
                saleCtr.addItem(newSaleItemSearch, newSaleItemAmount);
                waitInput();
            }
            catch(NullPointerException e)
            {
                System.out.println("Der skete en fejl under forsøget på at tilføje en vare til salget");
                System.out.println("(Muligvis findes varen ikke i system)");
                waitInput();
            }
        }
        else
        {
            System.out.println("Du skal indtaste et gyldig vare nummer");
            waitInput();
        }
    }
    
    /**
     * remove item from the new sale
     */
    private void removeItemfromSale()
    { 
        System.out.println("Indtast id på den vare som skal fjernes fra salget");
        String searchItemCode = inputString();
        
        if (searchItemCode != null && !searchItemCode.isEmpty())
        {   
            try
            {
                saleCtr.removeItem(searchItemCode);
                waitInput();
            }
            catch(NullPointerException e)
            {
                System.out.println("Varen med vare nummer: " + searchItemCode + " kunne ikke fjernes fra salget");
                System.out.println("(muligvis fordi varen ikke er tilføjet salget)");
                waitInput();
            }
        }
        else
        {
            System.out.println("Du skal indtaste et gyldig vare nummer");
            waitInput();
        }
    }
    
    /**
     * show all partsales (added items) from the new sale
     */
    private void showAllPartSales()
    {   
        try
        {
            saleCtr.listAllPartSales();
            waitInput();
        }
        catch(NullPointerException e)
        {
            System.out.println("Der skete en fejl, da systemet prøvede at liste alle varer i salget");
            waitInput();
        }
    }
    
    /**
     * end the new sale
     */
    private void endSale()
    {   
        try
        {
            saleCtr.endSale();       
            waitInput();
        }
        catch(NullPointerException e)
        {
            System.out.println("Salget kunne afsluttes på grund af en fejl");
            waitInput();
        }
    }
}
